//Библиотека Qt.
#include <QtGui>


//Внутренняя библиотека.
#include "devcolorsdialog.h"


//===========================================================================//
//=Заголовок: DevColorsDialog::DevColorsDialog() - public
//=Параметры:
//=Описание: Конструктор.
//===========================================================================//
DevColorsDialog::DevColorsDialog(VidDevice *viddev, QWidget *parent) : QDialog(parent)
{
qRegisterMetaType<DevParam::SET_PARAM>();

vidDev = viddev;
connect(this, SIGNAL(setParam(DevParam::SET_PARAM, int)), vidDev, SLOT(slotSetParam(DevParam::SET_PARAM, int)), Qt::QueuedConnection);

QVBoxLayout *brightlayout = NULL;
QVBoxLayout *contrastlayout = NULL;
QVBoxLayout *huelayout = NULL;
QVBoxLayout *saturationlayout = NULL;

//Получить параметры яркости устройства.
QVariant brightness;
if(vidDev->getParam(DevParam::GET_BRIGHTNESS, &brightness))
	{
	QHash<QString, QVariant> varhash = brightness.toHash();
	int min = varhash.value("min", 0).toInt();
	int max = varhash.value("max", 0).toInt();
	int step = varhash.value("step", 0).toInt();
	int val = varhash.value("val", 0).toInt();

	//Создать менеджер размещения.
	brightlayout = new QVBoxLayout();
	brightlayout->setMargin(2); brightlayout->setSpacing(2);

	//Создать виджеты смены яркости.
	QLabel *brightlabel = new QLabel(tr("Яркость:"), this);
	QSlider *brightslider = new QSlider(Qt::Horizontal, this);
	brightslider->setRange(min, max);
	brightslider->setSingleStep(step);
	brightslider->setValue(val);
	connect(brightslider, SIGNAL(valueChanged(int)), this, SLOT(slotBrightnessChanged(int)));
	brightlayout->addWidget(brightlabel);
	brightlayout->addWidget(brightslider);
}

//Получить параметры контрастности устройства.
QVariant contrast;
if(vidDev->getParam(DevParam::GET_CONTRAST, &contrast))
	{
	QHash<QString, QVariant> varhash = contrast.toHash();
	int min = varhash.value("min", 0).toInt();
	int max = varhash.value("max", 0).toInt();
	int step = varhash.value("step", 0).toInt();
	int val = varhash.value("val", 0).toInt();

	//Создать менеджер размещения.
	contrastlayout = new QVBoxLayout();
	contrastlayout->setMargin(2); contrastlayout->setSpacing(2);

	//Создать виджеты смены контрастности.
	QLabel *contrastlabel = new QLabel(tr("Контрастность:"), this);
	QSlider *contrastslider = new QSlider(Qt::Horizontal, this);
	contrastslider->setRange(min, max);
	contrastslider->setSingleStep(step);
	contrastslider->setValue(val);
	connect(contrastslider, SIGNAL(valueChanged(int)), this, SLOT(slotContrastChanged(int)));
	contrastlayout->addWidget(contrastlabel);
	contrastlayout->addWidget(contrastslider);
}

//Получить параметры цветового баланса устройства.
QVariant hue;
if(vidDev->getParam(DevParam::GET_HUE, &hue))
	{
	QHash<QString, QVariant> varhash = hue.toHash();
	int min = varhash.value("min", 0).toInt();
	int max = varhash.value("max", 0).toInt();
	int step = varhash.value("step", 0).toInt();
	int val = varhash.value("val", 0).toInt();

	//Создать менеджер размещения.
	huelayout = new QVBoxLayout();
	huelayout->setMargin(2); huelayout->setSpacing(2);

	//Создать виджеты смены контрастности.
	QLabel *huelabel = new QLabel(tr("Цветовой баланс:"), this);
	QSlider *hueslider = new QSlider(Qt::Horizontal, this);
	hueslider->setRange(min, max);
	hueslider->setSingleStep(step);
	hueslider->setValue(val);
	connect(hueslider, SIGNAL(valueChanged(int)), this, SLOT(slotHueChanged(int)));
	huelayout->addWidget(huelabel);
	huelayout->addWidget(hueslider);
}

//Получить параметры насыщенности устройства.
QVariant saturation;
if(vidDev->getParam(DevParam::GET_SATURATION, &saturation))
	{
	QHash<QString, QVariant> varhash = saturation.toHash();
	int min = varhash.value("min", 0).toInt();
	int max = varhash.value("max", 0).toInt();
	int step = varhash.value("step", 0).toInt();
	int val = varhash.value("val", 0).toInt();

	//Создать менеджер размещения.
	saturationlayout = new QVBoxLayout();
	saturationlayout->setMargin(2); saturationlayout->setSpacing(2);

	//Создать виджеты смены контрастности.
	QLabel *saturationlabel = new QLabel(tr("Насыщенность:"), this);
	QSlider *saturationslider = new QSlider(Qt::Horizontal, this);
	saturationslider->setRange(min, max);
	saturationslider->setSingleStep(step);
	saturationslider->setValue(val);
	connect(saturationslider, SIGNAL(valueChanged(int)), this, SLOT(slotSaturationChanged(int)));
	saturationlayout->addWidget(saturationlabel);
	saturationlayout->addWidget(saturationslider);
}

//Создать менеджер размещения.
QHBoxLayout *butlayout = new QHBoxLayout();
butlayout->setMargin(5); butlayout->setSpacing(5);

//Создать кнопку.
QPushButton *closebut = new QPushButton(tr("Закрыть"), this);
connect(closebut, SIGNAL(clicked()), this, SLOT(accept()));
butlayout->addStretch(1);
butlayout->addWidget(closebut);
butlayout->addStretch(1);

//Создать главный менеджер размещения.
QGridLayout *mainlayout = new QGridLayout(this);
mainlayout->setMargin(5); mainlayout->setSpacing(5);

if(brightlayout)     mainlayout->addLayout(brightlayout, 0, 0);
if(contrastlayout)   mainlayout->addLayout(contrastlayout, 1, 0);
if(huelayout)        mainlayout->addLayout(huelayout, 2, 0);
if(saturationlayout) mainlayout->addLayout(saturationlayout, 3, 0);

mainlayout->addLayout(butlayout, 4, 0);
mainlayout->setRowStretch(4, 1);
}


//===========================================================================//
//=Заголовок: void DevColorsDialog::slotBrightnessChanged() - private slots
//=Параметры:
//=Описание: Слот изменения яркости.
//===========================================================================//
void DevColorsDialog::slotBrightnessChanged(int value)
{emit setParam(DevParam::SET_BRIGHTNESS, value);}


//===========================================================================//
//=Заголовок: void DevColorsDialog::slotContrastChanged() - private slots
//=Параметры:
//=Описание: Слот изменения контрастности.
//===========================================================================//
void DevColorsDialog::slotContrastChanged(int value)
{emit setParam(DevParam::SET_CONTRAST, value);}


//===========================================================================//
//=Заголовок: void DevColorsDialog::slotHueChanged() - private slots
//=Параметры:
//=Описание: Слот изменения цветового баланса.
//===========================================================================//
void DevColorsDialog::slotHueChanged(int value)
{emit setParam(DevParam::SET_HUE, value);}


//===========================================================================//
//=Заголовок: void DevColorsDialog::slotSaturationChanged() - private slots
//=Параметры:
//=Описание: Слот изменения насыщенности.
//===========================================================================//
void DevColorsDialog::slotSaturationChanged(int value)
{emit setParam(DevParam::SET_SATURATION, value);}
